<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    function getDate(url) {
      const pro = new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest()
        xhr.open('GET', url)
        xhr.send()
        xhr.onreadystatechange = function () {
          if (xhr.readyState !== 4) return
          if (xhr.readyState === 4 && xhr.status === 200) {
            resolve(xhr.responseText)
          } else {
            reject('服务器错误')
          }
        }
      })
      return pro
    }
    // 使用Promise是解决ajax执行顺序以及回调地狱问题 解决方法
    // 1、在第一个异步操作return 处理另一个操作
    // 2、在外部，使用.then的方式接受返回的异步操作结果

    /*
      then 方法可以返回两个值
      1、返回的第一种是Promise 实例对象 会调用下一个then 接受到返回的结果
      2、返回的第二种就是一个字符串 如果返回的是一个字符串 在下一个then中还是能够调用
      这是因为Promise 会默认初始化一个实例对象 从而将字符串传递给下一个then
      结论 ： 无论返回的是一个字符串还是一个Promise实例 在下一个then都能够访问到
    */
    // getDate('http://127.0.0.1:3000/data').then((data) => {
    //   console.log(data);
    //   return getDate('http://127.0.0.1:3000/data1')
    // }).then((data) => {
    //   console.log(data);
    //   return getDate('http://127.0.0.1:3000/data2')
    // }).then((data) => {
    //   console.log(data)
    //   return '盖伦'
    // }).then((data) => {
    //   console.log(data);

    // })

    var p1 = getDate('http://localhost:3000/a1')
    var p2 = getDate('http://localhost:3000/a2')
    var p3 = getDate('http://localhost:3000/a3')
    /*
      .all 并发处理多个异步请求 返回每一个异步请求结果 等待所有异步请求完 返回结果
      .race 并发处理多个异步请求 返回最快请求完的结果，只要有一个结果执行完 就返回结果
    */
    Promise.all([p1, p2, p3]).then((data) => {
      console.log(data);
    })
    // Promise.race([p1, p2, p3]).then((data) => {
    //   console.log(data);
    // })
  </script>
</body>

</html>